#include <iostream>

using std::cout;
using std::endl;

//函数写法,但函数调用都是有开销的
//在调用一个新的函数时，需要先保存原来函数栈空间的现场
//切换到新函数的栈空间；当新函数执行完毕之后，需要恢复
//原来函数的栈空间的现场

//为了提升程序的执行效率，可以使用宏函数代替
//宏函数起作用的时机是在预处理时
//注意：使用宏函数的地方是有犯错误的风险，而且会延迟到运行时
#define MAX(x,y) (x > y ? x : y)

#define MULTIPLY(x, y) ((x) * (y))


//inline函数，就是在普通函数的返回值之前，加上inline关键字，
//那么该函数就称为inline函数。
//inline函数的作用于宏函数类似，是在编译时用函数执行体的语句替换掉
//函数, 最终也没有函数调用的开销了,可以提升程序的执行效率
//
//相比宏函数而言，其安全性会更高, 是有类型检查的, 犯错误的概率会更小

//inline函数在debug版本中，是可以进行调试的, 相比宏函数而言，这是其优势
//
//在release版本中，又会直接用函数体的语句进行替换
//
//debug版本的程序会携带大量的调试信息，执行起来是要比release版本慢
//
//注意：对于比较短小的函数，可以使用inline函数来提升执行效率
//但并不是所有的情况，都适合使用Inline函数，尤其是在函数中有大量循环操作，
//代码量很长时，不适合使用inline函数, 否则会出现代码膨胀的问题

//有一些现代编译器会自动识别该函数是否可以设置为inline函数, 可以自动进行
//优化工作
inline
int multiply(int x, int y);//inline函数声明



//函数起作用的时机是在编译时
int max(int x, int y) 
{
    return x > y ? x : y;
}


int main()
{
    int a = 1, b = 2, c = 3;
    cout << max(a, b) << endl;

    cout << MAX(a, b) << endl;

    cout << MULTIPLY(a, b) << endl;// 1 * 2 = 2

    cout << MULTIPLY(a + b, b + c) << endl;

    cout << multiply(a + b, b + c) << endl;
    //在编译时，该语句会被替换成以下语句，但编译器隐藏了该过程
    //cout << (a + b) * (b + c) << endl;
    return 0;
}

inline
int multiply(int x, int y) //inLine函数的实现
{
    return x * y;
}
